package lab1;

import java.util.InputMismatchException;
import java.util.Scanner;

/**
 * Производит простейшие арифметические операции с целыми числами. Абсолютное
 * значение чисел не должно превышать 10^4.
 * 
 * @author Krotov S.V. ИВТм-11
 */
public class mySmallInteger {
	private int data1;
	private int data2;
	private static Scanner s;

	/**
	 * Конструктор.
	 * 
	 * @param a
	 *            первая переменная
	 * @param b
	 *            вторая переменная
	 */
	public mySmallInteger(int a, int b) {
		data1 = a;
		data2 = b;
	}

	/**
	 * Метод выполняет операцию сложения двух чисел.
	 * 
	 * @return возвращает сумму чисел
	 */
	public int add() {
		return data1 + data2;
	}

	/**
	 * Метод нахождения разницы чисел.
	 * 
	 * @return возвращает разницу чисел
	 */
	public int sub() {
		return data1 - data2;
	}

	/**
	 * Метод умножения чисел.
	 * 
	 * @return возвращает произведение чисел
	 */
	public int mul() {
		return data1 * data2;
	}

	/**
	 * Метод деления чисел.
	 * 
	 * @return возвращает результат деления без остатка
	 */
	public int div() {
		return data1 / data2;
	}

	/**
	 * 
	 * Метод считывания вводымых данных. Будет работать пока пользователь не
	 * введет правильное число. Правильное число должно быть типом int, и по
	 * условию задачи не превышать по абсолютному значению 10^4.
	 * 
	 * @exception InputMismatchException
	 *                возникает при несоответствии вводимых данных
	 *                целочисленному типу
	 * @return возвращает введенное с клавиатуры число
	 */
	public static int read() {
		int g;
		while (true) {
			s = new Scanner(System.in);
			try {
				g = s.nextInt();
				if (g > 10000) {
					System.out.println("Слишком большое число!");
				} else if (g < -10000) {
					System.out.println("Слишком большое отрицательное число!");
				} else {
					return g;
				}
			} catch (InputMismatchException e) {
				System.out.println("Неверное число!");
			}
		}
	}

	/**
	 * 
	 * Метод выводит список возможных операций и требует пользователя выбрать
	 * один из них. При неверном выборе операциии метод будет предупреждать о
	 * том что такого пункта нет, и будет просить пользователя выбрать нужную
	 * операцию еще раз.
	 * 
	 * @return возвращает выбранный номер операции
	 * 
	 * @throws InputMismatchException
	 *             возникает при несоответствии вводимых данных целочисленному
	 *             типу
	 */
	private static int menu() {
		int choice;
		boolean q = false;
		while (true) {
			try {
				do {
					if (q == true) {
						System.out
								.println("Нет такого пункта! Попробуйте еще раз.");
					}
					System.out.println("Выберите требуемую операцию:");
					System.out.println("1. a+b");
					System.out.println("2. a-b");
					System.out.println("3. a*b");
					System.out.println("4. a/b");

					s = new Scanner(System.in);
					choice = s.nextInt();
					q = (choice < 1 || choice > 4);
				} while (q == true);
				return choice;
			} catch (InputMismatchException e) {
				System.out.println("Нет такого пункта! Попробуйте еще раз.");
			}
		}
	}

	/**
	 * 
	 * Метод принимает значения двух переменных a и b, а так же переменную
	 * choice значение которой соответствует необходимой арифметической операции
	 * между переменными. Выводит результат выполнения выбранной операции.
	 * 
	 * @param a
	 *            первая переменная
	 * @param b
	 *            вторая переменная
	 * @param choice
	 *            выбранная операция
	 * @exception ArithmeticException
	 *                возникает при попытке деления на ноль
	 */
	private static void output(int a, int b, int choice) {
		mySmallInteger ob1 = new mySmallInteger(a, b);
		switch (choice) {
		case 1:
			System.out.println("a+b=" + a + "+" + b + "=" + ob1.add());
			break;
		case 2:
			System.out.println("a-b=" + a + "-" + b + "=" + ob1.sub());
			break;
		case 3:
			System.out.println("a*b=" + a + "*" + b + "=" + ob1.mul());
			break;
		case 4:
			try {
				System.out.println("a/b=" + a + "/" + b + "=" + ob1.div());
				break;
			} catch (ArithmeticException e) {
				System.out.println("a/b=" + a + "/" + b);
				System.out.println("Ошибка! Деление на ноль!");
			}
		}
	}

	/**
	 * 
	 * Метод main, с которого начинается работа программы. Вызывает метод для
	 * считывания переменных read(). Далее вызывает метод menu(), который
	 * возвращает значение соответствующее нужной операции. Затем вызывает метод
	 * output(a, b, choice), который выводит результат выполнения арифметической
	 * операции.
	 * 
	 * @throws java.io.IOException
	 *             обрабатывает ошибки ввода/вывода
	 */
	public static void main(String agrs[]) throws java.io.IOException {
		System.out.println("Введите первое число a:");
		int a;
		int b;
		a = read();
		System.out.println("Введите второе число b:");
		b = read();
		System.out.println("Вы ввели числа a=" + a + " и b=" + b + ".");
		int choice = menu();
		System.out.print('\n');
		output(a, b, choice);
	}
}
